/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package espe.ccsoft.dao;

import espe.ccsoft.db.Conexion;
import espe.ccsoft.models.Ayudante;
import espe.ccsoft.models.Unidad;
import espe.ccsoft.orm.ORMBase;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Carlos
 */
public class UnidadDao extends ORMBase<Unidad> {

    private PreparedStatement ps = null;
    private FileInputStream fis = null;
    private final Conexion conexionDB = new Conexion();

    public final Unidad findByPK(final int id) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findByPkSql = "select * FROM UNIDAD"
                + " WHERE UNI_ID=?";
        return super.findByPK(new Object[]{
            id,});
    }

    public final Unidad findByHabilitacion(final String num) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findByPkSql = "select * FROM UNIDAD"
                + " WHERE UNI_NUMHABILITACION=?";
        return super.findByPK(new Object[]{
            num,});
    }
    
    public final Unidad findByNumUnidad(final int num) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findByPkSql = "select * FROM UNIDAD"
                + " WHERE UNI_NUMBUS=?";
        return super.findByPK(new Object[]{
            num,});
    }

    public final void insert(final Unidad unidad) throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:                   
        unidad.setEstado(true);
        unidad.setFecha_creacion(new java.sql.Timestamp(new java.util.Date().getTime()));
        unidad.setOperadora(1);
        super.insertSql = "INSERT INTO UNIDAD ("
                + "UNI_ID,"
                + "OPE_ID,"
                + "UNI_NUMBUS,"
                + "UNI_NUMHABILITACION,"
                + "UNI_PLACA,"
                + "UNI_ANOFABRICACION," 
                + "UNI_CHASIS,"
                + "UNI_MOTOR,"
                + "UNI_CARROCERIA,"
                + "UNI_TIPO,"
                + "UNI_CAPACIDAD,"
                + "UNI_PUERTAS,"
                + "UNI_PUERTASIZQUIERDA,"
                + "UNI_FOTO,"
                + "UNI_ESTADO"
                + ") VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        super.insert(new Object[]{
            unidad.getId(),
            unidad.getOperadora(),
            unidad.getNumero(),
            unidad.getHabilitacion(),
            unidad.getPlaca(),
            unidad.getAnioFabricacion(),
            unidad.getChasis(),
            unidad.getMotor(),
            unidad.getCarroceria(),
            unidad.getTipo(),
            unidad.getCapacidad(),
            unidad.getPuertas(),
            unidad.getPuertasIzq(),
            unidad.getFoto(),
            unidad.isEstado(),});
        guardaImagen(unidad);
    }

    private void guardaImagen(Unidad unidad) throws SQLException, Exception {
        String insert = "update UNIDAD SET uni_foto=?";
        try (Connection conn = conexionDB.conectar()) {
            try (PreparedStatement stmt = conn.prepareStatement(insert)) {

                if (unidad.getFile().getFileName().compareTo("") == 0) {
                    File file = new File(unidad.getRutaFoto());
                    fis = new FileInputStream(file);
                    stmt.setBinaryStream(1, fis);                    
                } else {
                    InputStream is = unidad.getFile().getInputstream();
                    stmt.setBinaryStream(1, is);
                    stmt.setString(2, unidad.getHabilitacion());
                }

                stmt.executeUpdate();
                conn.commit();
            }
            conexionDB.desconectar(conn);
        } catch (SQLException ex) {
            Logger.getLogger(ORMBase.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public final List<Unidad> findAll() throws SQLException, Exception {
        // Sentencia SQL para realizar la consulta a la BD:
        super.findAllSql = "SELECT * FROM unidad WHERE UNI_ESTADO=1";
        return super.findAll();
    }

    protected Unidad crearObjeto(ResultSet rs) throws SQLException {
        Unidad unidad = new Unidad();
        unidad.setId(rs.getInt("UNI_ID"));
        unidad.setOperadora(rs.getInt("OPE_ID"));
        unidad.setNumero(rs.getInt("UNI_NUMBUS"));
        unidad.setHabilitacion(rs.getString("UNI_NUMHABILITACION"));
        unidad.setPlaca(rs.getString("UNI_PLACA"));
        unidad.setAnioFabricacion(rs.getInt("UNI_ANOFABRICACION"));
        unidad.setChasis(rs.getString("UNI_CHASIS"));
        unidad.setMotor(rs.getString("UNI_MOTOR"));
        unidad.setCarroceria(rs.getString("UNI_CARROCERIA"));
        unidad.setTipo(rs.getString("UNI_TIPO"));
        unidad.setCapacidad(rs.getInt("UNI_CAPACIDAD"));
        unidad.setPuertas(rs.getInt("UNI_PUERTAS"));
        unidad.setPuertasIzq(rs.getInt("UNI_PUERTASIZQUIERDA"));
        unidad.setFoto(rs.getBlob("UNI_FOTO"));
        unidad.setEstado(rs.getBoolean("UNI_ESTADO"));
        return unidad;
    }

    public void update(Unidad unidad) throws Exception {
        super.updateSql = "UPDATE UNIDAD SET "
                + "UNI_NUMBUS=?, "
                + "UNI_NUMHABILITACION=?, "
                + "UNI_PLACA=?, "
                + "UNI_ANOFABRICACION=?, "
                + "UNI_CHASIS=?, "
                + "UNI_MOTOR=?, "
                + "UNI_CARROCERIA=?, "
                + "UNI_TIPO=?, "
                + "UNI_CAPACIDAD=?, "
                + "UNI_PUERTAS=?, "
                + "UNI_PUERTASIZQUIERDA=?, "
                + "UNI_FOTO=?, "
                + "UNI_ESTADO=? "
                + "WHERE UNI_ID=?";
        super.update(new Object[]{
            unidad.getNumero(),
            unidad.getHabilitacion(),
            unidad.getPlaca(),
            unidad.getAnioFabricacion(),
            unidad.getChasis(),
            unidad.getMotor(),
            unidad.getCarroceria(),
            unidad.getTipo(),
            unidad.getCapacidad(),
            unidad.getPuertas(),
            unidad.getPuertasIzq(),
            unidad.getFoto(),
            unidad.isEstado(),
            unidad.getId(),});

        if (unidad.getFile().getFileName().compareTo("") != 0) {
            guardaImagen(unidad);
        }
    }
}
